芯驰 E3 烧录的 IAR 配置
链接文件
通过链接文件可以指定程序的代码和数据在内存空间的位置。
define symbol intvec_start__ = 0x404000;
define symbol STACK_SZ = 0x14000;
define symbol HEAP_SZ = 0x4000;
define symbol DMA_BLOCK_SZ = 0x20000;
define symbol __ICFEDIT_region_SFS_start__ = 0x10000000;
define memory mem with size = 4G;
define region TCM = mem:[from 0x40 to 0xffff];
define region FLASH = mem:[from 0x100c1000 to 0x107fffff];
define region IRAM = mem:[from 0x404000 to 0x5fffff];
do not initialize { section .noinit };
do not initialize { section .zeroinit };
do not initialize { section .bss };
do not initialize { section .iram_bss };
do not initialize { section .tcm_bss };
do not initialize { section .mcal_bss.* };
do not initialize { section .dma_buffer };
initialize manually { readwrite };
initialize manually { section .data};
initialize manually { section .mcal_data.* };
initialize manually { section .iram_data };
initialize manually { section .tcm_data };
initialize manually { section .tcm_func, section .mcal_text.fast.* };
initialize manually { section .iram_func };
define block VECTOR_TBL with alignment = 32 { readonly section .vector };
define block TEST_SECTION with alignment = 32 { readonly section TEST_SECTION};
define block shell_cmd with alignment = 32 { readonly section shell_cmd};
define block CBSS with alignment = 32 { section .bss};
define block MCALBSS with alignment = 32 { section .mcal_bss.* };
define block CDATA with alignment = 32 { section .data };
define block MCALDATA with alignment = 32 { section .mcal_data.* };
define block MCALCONST_CFG with alignment = 32 { readonly section .mcal_const_cfg.* };
define block MCALCONST with alignment = 32 { readonly section .mcal_const.* };
define block MCALTEXT with alignment = 32 { section .mcal_text.* };
define block IRAMFUNC with alignment = 32 { section .iram_func };
define block TCMFUNC with alignment = 32 { section .tcm_func, section .mcal_text.fast.* };
define block IRAMDATA with alignment = 32 { section .iram_data };
define block TCMDATA with alignment = 32 { section .tcm_data };
define block IRAMBSS with alignment = 32 { section .iram_bss};
define block TCMBSS with alignment = 32 { section .tcm_bss};
define block TEXT with alignment = 32 { section .text};
define block RODATA with alignment = 32 { section .rodata};
define block CDATA_init with alignment = 32 { section .data_init };
define block MCALDATA_init with alignment = 32 { section .mcal_data.*_init };
define block IRAMFUNC_init with alignment = 32 { section .iram_func_init };
define block TCMFUNC_init with alignment = 32 { section .tcm_func_init, section .mcal_text.fast.*_init };
define block IRAMDATA_init with alignment = 32 { section .iram_data_init };
define block TCMDATA_init with alignment = 32 { section .tcm_data_init };
define block DMABUFFER with alignment = 128k, size = DMA_BLOCK_SZ { readwrite section .dma_buffer, section .mcal_bss.*.nocache };
define block CSTACK with alignment = 32, size = STACK_SZ { };
define block HEAP with alignment = 32, minimum size = HEAP_SZ, expanding size { };
place in IRAM { readwrite };
place in IRAM { block CBSS };
place in IRAM { block MCALBSS };
place in IRAM { block CDATA };
place in IRAM { block MCALDATA };
place in IRAM { block HEAP, block CSTACK };
place in TCM { block TCMBSS };
place in TCM { block TCMDATA };
place in TCM { block TCMFUNC };
place in IRAM { readonly, block RODATA, block TEXT, block TEST_SECTION, block shell_cmd};
place in IRAM { block CDATA_init };
place in IRAM { block MCALDATA_init };
place in IRAM { block MCALCONST_CFG };
place in IRAM { block MCALCONST };
place in IRAM { block MCALTEXT };
place in IRAM { block TCMFUNC_init };
place in IRAM { block TCMDATA_init };
place in IRAM { block IRAMFUNC_init };
place in IRAM { block IRAMDATA_init };
place in IRAM { block IRAMBSS };
place in IRAM { block IRAMDATA };
place in IRAM { block IRAMFUNC };
place in IRAM { block DMABUFFER};
place at address mem:intvec_start__ { block VECTOR_TBL };
place at address mem:__ICFEDIT_region_SFS_start__ { section SFS_BIN };
export symbol intvec_start__;
自定义命令
通过 Build Actions 可以设置编译时的自定义命令,这里设置了编译后对镜像的签名动作。
镜像下载
通过 Flash loader(s) 可以设置固件下载的地址,工程的 Debug 模式下,程序默认直接下载到 IRAM 执行。工程的 Release 模式下,程序根据 Flash loader(s) 指定的地址,将程序下载到 Flash 在 MCU 中对应的地址空间下,这样程序会烧录到 Flash 上。
烧录总结
这几个选项包括了程序从编译到烧录的相关地址的设置。首先编译器根据链接文件将代码和数据链接到 0x404000 到 0x7FFFFF 的 IRAM 空间(虚拟地址空间),即程序的逻辑运行地址(VMA,Virtual Memory Address)。然后烧录时,根据 Flash loader(s) 的 Relocate 设置,IAR 将虚拟地址范围 0x404000-0x7FFFFF 中的数据映射到 Flash 的地址空间 0x100C1000 位置,即程序的加载地址(LMA,Load Memory Address)。